#ifndef TODO_MODULE_H
#define TODO_MODULE_H

#include <map>

namespace todo
{ 
class TodoClass;
class todo_function;
class todo_value;
}

namespace todo { namespace mod {

class TodoModule {
protected:
	std::string import_name;
	std::map<std::string, TodoClass*> classes;
	std::map<std::string, todo_function*> functions;
	std::map<std::string, todo_value*> constants;
public:
	TodoModule(const char* name) : import_name(std::string(name)) { }
	std::string& getName(void ) { return import_name; }
	
	virtual TodoModule* createInstance(const std::string&) = 0;
	virtual void init(void) = 0;
	
	void callMethod(const std::string&, const std::string&);
	void addClassModule(const char*, TodoClass*);
};

class TodoModules {
	std::map<std::string, TodoModule*> modules;
public:
	void add(TodoModule* module);
	TodoModule* getModule(const std::string& name);
};

typedef void (TodoModule::*method_handler)(void);

}} // todo::mod

#endif // TODO_MODULE_H
